/**
  ******************************************************************************
  * @file    encoder_module.h
  * @brief   编码器模块
  * @version V1.1.0
  * @date    2025-07-21
  ******************************************************************************
  */

#ifndef __ENCODER_H
#define __ENCODER_H

#include <stdint.h>
#include "main.h"

/* 编码器配置参数 */
#define ENCODER_PPR           13      // 每圈脉冲数
#define ENCODER_QUADRATURE    4       // 四倍频
#define ENCODER_SAMPLE_TIME   20      // 采样周期(ms)
#define ENCODER_FILTER_SIZE   5       // 滤波缓冲区大小
#define WHEEL_RADIUS          24.0    // 轮胎半径(mm)
#define GEAR_RATIO            20      // 减速比
#define MAX_ENCODER_COUNT     4       // 最大编码器数量

/* 定时器参数 */
#define ENCODER_COUNTER_MIDPOINT      32768
#define ENCODER_OVERFLOW_THRESHOLD    32767
#define ENCODER_OVERFLOW_RANGE        65536

/* 编码器数据结构 */
typedef struct {
    int32_t total_count;
    int32_t last_count;
    int32_t last_count_for_speed;
    int16_t speed_rpm;
    int16_t speed_buffer[ENCODER_FILTER_SIZE];
    uint8_t buffer_index;
    unsigned long last_update_time;
    float position_mm;
    float last_position_mm;
    uint8_t initialized;
    TIM_HandleTypeDef* htim;
} Encoder_Data_t;

/* 操作结果枚举 */
typedef enum {
    MOTOR_OK = 1,
    MOTOR_HARDWARE_ERROR = 0
} Motor_Result_t;

typedef uint8_t encoder_handle_t;

/* API函数接口 */
encoder_handle_t Encoder_Create(TIM_HandleTypeDef* htim);
Motor_Result_t Encoder_Init(encoder_handle_t handle);
void Encoder_Destroy(encoder_handle_t handle);

int32_t Encoder_GetCount(encoder_handle_t handle);
int16_t Encoder_GetSpeed(encoder_handle_t handle);
float Encoder_GetPosition(encoder_handle_t handle);
float Encoder_GetDistance(encoder_handle_t handle);

void Encoder_Reset(encoder_handle_t handle);
Motor_Result_t Encoder_Calibrate(encoder_handle_t handle);

Motor_Result_t Encoder_QuickInit(TIM_HandleTypeDef* htim, encoder_handle_t* handle);
uint8_t Encoder_IsValid(encoder_handle_t handle);

#endif
